class Observer{
    constructor(data){
        this.walk(data);
    }
    walk(data){
        if(!data || typeof data !== 'object'){
            return;
        }
        Object.keys(data).forEach(key => {
            this.defineReactive(data,key,data[key]);
        })
    }
    defineReactive(obj,key,value){
        // 如果value是对象，则将value内部的属性也改成getter/setter
        this.walk(value);
        const _this = this;
        // 收集依赖并发送通知
        let dep = new Dep();
        Object.defineProperty(obj,key,{
            enumerable: true,
            configurable: true,
            get() {
                // 收集依赖
                Dep.target && dep.addSub(Dep.target);
                return value;
            },
            set(newValue){
                if(newValue === value){
                    return;
                }
                value = newValue;
                _this.walk(newValue);
                dep.notify();
            }
        });
    }
}
